import type { Locale } from 'ant-design-vue/es/locale'

import type { App } from 'vue'

import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales'

import { ref } from 'vue'

import { $t, setupI18n as coreSetup, loadLocalesMapFromDir } from '@vben/locales'
import { preferences } from '@vben/preferences'

import antdEnLocale from 'ant-design-vue/es/locale/en_US'
import antdDefaultLocale from 'ant-design-vue/es/locale/zh_CN'
import dayjs from 'dayjs'
import { getLocalesAll, getLocales } from '#/api/mango-admin/locales'

const antdLocale = ref<Locale>(antdDefaultLocale)

const modules = import.meta.glob('./langs/**/*.json')

const localesMap = loadLocalesMapFromDir(/\.\/langs\/([^/]+)\/(.*)\.json$/, modules)
/**
 * 加载应用特有的语言包
 * 这里也可以改造为从服务端获取翻译数据
 * @param lang
 */
async function loadMessages(lang: SupportedLanguagesType) {
  let local = {}
  // const [appLocaleMessages] = await Promise.all([
  //   localesMap[lang]?.(),
  //   loadThirdPartyMessage(lang),
  // ])
  try {
    const res = await getLocalesAll({
      lang
    })
    local = res
  } catch (error) {
    console.log('国际化出错', error)
    local = {}
  }
  try {
    loadThirdPartyMessage(lang)
  } catch (error) {}
  return local

  // return appLocaleMessages?.default
}
// async function loadMessages(lang: SupportedLanguagesType) {
//   const [appLocaleMessages] = await Promise.all([localesMap[lang]?.(), loadThirdPartyMessage(lang)])
//   return appLocaleMessages?.default
// }

/**
 * 加载第三方组件库的语言包
 * @param lang
 */
async function loadThirdPartyMessage(lang: SupportedLanguagesType) {
  await Promise.all([loadAntdLocale(lang), loadDayjsLocale(lang)])
}

/**
 * 加载dayjs的语言包
 * @param lang
 */
async function loadDayjsLocale(lang: SupportedLanguagesType) {
  let locale
  switch (lang) {
    case 'en-US': {
      locale = await import('dayjs/locale/en')
      break
    }
    case 'zh-CN': {
      locale = await import('dayjs/locale/zh-cn')
      break
    }
    // 默认使用英语
    default: {
      locale = await import('dayjs/locale/en')
    }
  }
  if (locale) {
    dayjs.locale(locale)
  } else {
    console.error(`Failed to load dayjs locale for ${lang}`)
  }
}

/**
 * 加载antd的语言包
 * @param lang
 */
async function loadAntdLocale(lang: SupportedLanguagesType) {
  switch (lang) {
    case 'en-US': {
      antdLocale.value = antdEnLocale
      break
    }
    case 'zh-CN': {
      antdLocale.value = antdDefaultLocale
      break
    }
  }
}

async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
  await coreSetup(app, {
    defaultLocale: preferences.app.locale,
    loadMessages,
    missingWarn: !import.meta.env.PROD,
    ...options,
  })
}

export { $t, antdLocale, setupI18n }
